package editorarquivobmg.model;

import editorarquivobmg.util.ManipuladorDados;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;

public class BmgFile implements ISalvamento {

    private int size = 0;
    private byte[] cabecalho = null;
    private DAT1 dat1 = null;
    private INF1 inf1 = null;
    private FLW1 flw1 = null;
    private FLI1 fli1 = null;

    public BmgFile(INF1 inf1, DAT1 dat1, FLW1 flw1, FLI1 fli1, int size, byte[] cabecalho) {
        this.size = size;
        this.cabecalho = cabecalho;
        this.inf1 = inf1;
        this.dat1 = dat1;
        this.fli1 = fli1;
        this.flw1 = flw1;
    }

    public DAT1 getDat1() {
        return dat1;
    }

    public void setDat1(DAT1 dat1) {
        this.dat1 = dat1;
    }

    public byte[] getCabecalho() {
        return cabecalho;
    }

    public FLI1 getFli1() {
        return fli1;
    }

    public FLW1 getFlw1() {
        return flw1;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public INF1 getInf1() {
        return inf1;
    }

    public void modificarEndereco(int enderecoTexto, int pos) {
        inf1.modificarEndereco(enderecoTexto, pos);
    }

    public byte[] getDataPonteiro(int pos) {
        return inf1.getDataPonteiro(pos);
    }

    public void setDataPonteiro(byte[] data, int pos) {
        inf1.setDataPonteiro(data, pos);
    }

    public int getEnderecoTextoPonteiro(int pos) {
        return inf1.getEnderecoTextoPonteiro(pos);
    }

    public boolean ponteiroIsValido(int pos) {
        return inf1.ponteiroIsValido(pos);
    }

    public int getTamanhoPonteiro() {
        return inf1.getTamanhoPonteiro();
    }

    public byte[] getDataTexto(int pos) {
        return dat1.getDataTexto(pos);
    }

    public int getSizeTexto(int pos) {
        return dat1.getSizeTexto(pos);
    }

    public void modificarTexto(byte[] data, int pos) {
        int diferenca = dat1.modificarTexto(data, pos);
        size += diferenca;
    }

    public int getNumeroPonteiros() {
        return inf1.getNumeroPonteiros();
    }

    public ArrayList<Texto> getTextos() {
        return dat1.getTextos();
    }

    @Override
    public void salvar(File File) throws Exception {
        int temp = 16 - dat1.getSize() % 16;
        if (temp == 16) {
            temp = 0;
        }
        this.size += temp;

        ManipuladorDados.gravarTamanho(this.cabecalho, 8, this.size);
        FileOutputStream in = new FileOutputStream(File);
        in.write(cabecalho);
        in.close();

        inf1.salvar(File);
        dat1.salvar(File);
        flw1.salvar(File);
        fli1.salvar(File);
    }
}